// 写入数据集成文件

const client = require("../db.js");
const { v4: uuidv4 } = require("uuid");
const moment = require("moment");

const db = client.db(global.config.db.name); // 获取数据库对象（虽然已经在URI中指定，但这里可以再次确认）

let writeData = async (data, dbName, isBatch = false) => {
  return new Promise(async (resolve, reject) => {
    function isObject(prop) {
      return prop !== null && typeof prop === "object";
    }

    if (!data && !isObject(data)) {
      reject("参数不正确");
      return;
    }

    if (!dbName && typeof dbName != "string") {
      reject("集合对象名称不正确");
      return;
    }

    const collection = db.collection(dbName); // 获取集合对象

    // 如果是批量插入 执行下面的代码块
    if (isBatch) {
      try {
        // 批量处理数据
        // 需要批量插入的数据
        let addData = [];
        // 需要批量新增的数据
        let update = []

        data.forEach(item => {
          item.createTime = item.createTime ? item.createTime : moment().format("yyyy-MM-DD HH:mm:ss");
          if (item.id) {
            update.push(item)
          } else {
            addData.push({
              ...item,
              id: uuidv4(),
            })
          }
        })

        // 批量新增
        let result = {}
        if (addData.length > 0) {
          result = await collection.insertMany(addData);
        }


        // 批量修改
        if (update.length > 0) {
          let options = update.map((item) => {
            let id = item.id
            delete item.id
            delete item._id
            return {
              updateOne: {
                filter: { id: id },
                update: { $set: item },
                upsert: true,
              },
            };
          });

          await collection.bulkWrite(options, { ordered: false });
        }

        resolve({
          code: 20000,
          msg: `插入${result.insertedCount || 0}条数据,更新${update.length}条数据`
        })

      } catch (error) {
        reject({
          code: 50000,
          msg: error,
        });
      }
    }

    // 如果不是批量插入，判断是新增还是修改
    let documents = null;
    if (data.id) {
      // 查询原来的文件
      documents = (await collection.findOne({ id: data.id })) || null;
    }

    // 判断是否查询出来原来的数据 如果没有 就是新增 ， 如果有 就是修改
    if (documents && documents.id) {
      let id = data.id;
      delete data._id;
      delete data.id;
      // 修改单个文档
      let result = await collection.updateOne({ id: id }, { $set: data });
      if (result) {
        resolve({ msg: "操作成功", code: 20000 });
      } else {
        reject({ code: 50000, msg: "操作失败" });
      }
    } else {
      data.id = data.id ? data.id : uuidv4();
      data.createTime = data.createTime
        ? data.createTime
        : moment().format("yyyy-MM-DD HH:mm:ss");
      // 插入单个文档
      collection.insertOne(data, (err) => {
        if (err) {
          reject("Error inserting document:" + err);
          return;
        }

        resolve({ msg: "操作成功", code: 20000, id: data.id });
      });
    }
  });
};

module.exports = writeData;
